﻿/*压缩类型：完全*/
/**********************************************************
功能：右键菜单对象的定义
使用：
	1、在调用前必需先引入util.js
	2、必需为菜单指派一个全局变量，该变量始终指向菜单对象
样例：请参考flowchart_panel.js
相关文件：
	util.js
	rightbtnmenu.css
作者：叶中奇
创建时间：2005-06-01
修改记录：
	2005-06-07：完成主要的功能
**********************************************************/

//====================::::::::::右键菜单::::::::::====================

//引入相关的css文件
document.writeln("<link rel=stylesheet href='"+S_ResourcePath+"/css/rightbtnmenu.css'>");

/**********************************************************
功能：菜单对象
参数：
	ParentMenu
		字符串（操作菜单的全局变量名）
		菜单项对象（父级菜单项）
**********************************************************/
function RightButtonMenu(ParentMenu)
{
	//==========属性==========
	this.Left = 0;								//横坐标
	this.Top = 0;								//纵坐标
	this.Items = new Array;						//菜单项
	this.CurItem = null;						//当前扩展的子菜单项
	this.Parent = typeof(ParentMenu)=="string"?null:ParentMenu;		//父级菜单，null则表示该菜单是一级菜单
	
	//==========方法==========
	this.Show = RightButtonMenu_Show;			//显示菜单
	this.Hide = RightButtonMenu_Hide;			//隐藏菜单
	this.AddItem = RightButtonMenu_AddItem;		//增加菜单项
	
	//==========初始化==========
	var htmlCode = "<table class=rightmenu_main style='position:absolute; display:none' />";
	var newElem = document.createElement(htmlCode);
	document.body.appendChild(newElem);
	this.DOMElement = newElem;
	newElem.LKSObject = this;
	newElem.onclick = RightButtonMenu_Item_OnClick;
	if(this.Parent==null)
	{
		//若为一级菜单，则添加文档事件
		LKSEvent.AddEvent("oncontextmenu", ParentMenu+".Show();false");		//后面的false是返回值，终止oncontextmenu的默认操作
		LKSEvent.AddEvent("onclick", ParentMenu+".Hide();");
	}
}

/**********************************************************
功能：菜单项对象
参数：
	Parent：所在的菜单对象
	itemText：菜单项显示文字
	itemType：菜单类型，可为以下值
		"cmd"：命令菜单项
		"submenu"：扩展菜单项
		"line"：菜单项的线
	title：菜单项标题，默认为""
	func：函数，点击菜单项执行的操作
返回：菜单项对象
**********************************************************/
function RightButtonMenu_Item(Parent, itemText, itemType, title, func)
{
	//==========属性==========
	this.Parent = Parent;			//所在菜单
	this.Enabled = true;			//是否可用
	this.Checked = false;			//是否选中
	this.Text = itemText;			//菜单项显示文字
	this.Type = itemType;			//菜单类型
	this.Menu = (itemType=="submenu")?new RightButtonMenu(this):null;	//子菜单，Type="submenu"时生效
	this.OnClick = func;			//点击操作函数
	this.EnabledCheckFunc = null;	//用户定义，检查菜单项是否可用的函数
	
	//==========方法==========
	this.SetDefaultCSS = RightButtonMenu_Item_SetCSS;						//重置菜单项的CSS
	this.SetText = RightButtonMenu_Item_SetText;							//设置菜单项文本
	this.SetChecked = RightButtonMenu_Item_SetChecked;						//设置菜单项是否被选中
	this.SetEnabled = RightButtonMenu_Item_SetEnabled;						//设置菜单项是否可用
	this.SetEnabledCheckFunc = RightButtonMenu_Item_SetEnabledCheckFunc;	//设置EnabledCheckFunc函数
	
	//==========初始化==========
	var tdObj = Parent.DOMElement.insertRow(-1).insertCell(-1);
	this.DOMElement = tdObj;
	tdObj.LKSObject = this;
	tdObj.title = title?title:"";
	tdObj.noWrap = true;
	switch(itemType)
	{
		case "cmd":			//命令菜单
		tdObj.innerHTML = "&nbsp;&nbsp;"+itemText+"&nbsp;&nbsp;";
		tdObj.onmouseout = RightButtonMenu_Item_OnMouseout;
		tdObj.onmouseover = RightButtonMenu_Item_OnMouseover;
		break;
		
		case "submenu":		//扩展菜单
		var htmlCode = "<table border=0 cellpadding=0 cellspacing=0 width=100% height=100%><tr>";
		htmlCode += "<td class=rightmenu_sub nowrap>&nbsp;&nbsp;"+itemText+"&nbsp;&nbsp;</td><td width=1 class=rightmenu_sub>＞</td></tr></table>";
		tdObj.innerHTML = htmlCode;
		tdObj.onmouseover = RightButtonMenu_Item_OnMouseover;
		break;
		
		case "line":		//直线
		tdObj.innerHTML = "";
		tdObj.className = "rightmenu_line";
		break;
	}
	tdObj.onclick = RightButtonMenu_Item_OnClick;
}

//====================::::::::::菜单函数::::::::::====================

//增加菜单项，参数见菜单项对象
function RightButtonMenu_AddItem(itemText, itemType, title, func)
{
	var rtnObj = new RightButtonMenu_Item(this, itemText, itemType, title, func);
	this.Items[this.Items.length] = rtnObj;
	return rtnObj;
}

//显示菜单
function RightButtonMenu_Show()
{
	//隐藏子菜单
	if(this.CurItem!=null)
		this.CurItem.Menu.Hide();
	this.DOMElement.style.display = "";
	
	//获取显示位置，同时判断显示的位置是否超出页面范围，若超出则修改显示位置
	if(this.Parent==null)
	{
		//若该菜单为一级菜单，则显示在鼠标旁边
		this.Left = event.x;
		if(event.x+this.DOMElement.clientWidth>document.body.clientWidth)
			this.Left = event.x-this.DOMElement.clientWidth;
		this.Left += document.body.scrollLeft;
		this.Top = event.y;
		if(event.y+this.DOMElement.clientHeight>document.body.clientHeight)
			this.Top = event.y-this.DOMElement.clientHeight;
		this.Top += document.body.scrollTop;
	}else
	{
		//若该菜单为子菜单，则显示在父菜单项旁边
		var p = this.Parent.Parent;
		this.Left = p.Left + p.DOMElement.clientWidth;
		if(this.Left+this.DOMElement.clientWidth-document.body.scrollLeft>document.body.clientWidth)
			this.Left = p.Left-p.DOMElement.clientWidth-2;
		this.Top = event.y-event.offsetY+document.body.scrollTop-6;
		if(this.Top+this.DOMElement.clientHeight-document.body.scrollTop>document.body.clientHeight)
			this.Top = this.Top - this.DOMElement.clientHeight+25;
		p.CurItem = this.Parent;
		this.Parent.SetDefaultCSS();
	}
	this.DOMElement.style.left = this.Left;
	this.DOMElement.style.top = this.Top;
	
	//显示前，重置菜单项的可用属性
	for(var i=0; i<this.Items.length; i++)
		if(this.Items[i].Type!="line")
			this.Items[i].SetEnabled();
}

//隐藏菜单，同时隐藏子菜单
function RightButtonMenu_Hide()
{
	if(this.CurItem!=null)
		this.CurItem.Menu.Hide();
	if(this.Parent!=null)
	{
		this.Parent.Parent.CurItem = null;
		this.Parent.SetDefaultCSS();
	}
	this.DOMElement.style.display = "none";
}

//====================::::::::::菜单项函数::::::::::====================

//重置菜单项的CSS
function RightButtonMenu_Item_SetCSS()
{
	this.DOMElement.className = this.Type=="line"?"rightmenu_line":(this.Enabled?"rightmenu_nor":"rightmenu_dis");
}

//设置菜单项文本，不传参数则引用原值
function RightButtonMenu_Item_SetText(itemText)
{
	if(itemText!=null)
		this.Text = itemText;
	this.DOMElement.innerHTML = (this.Checked?"*":"&nbsp;&nbsp;")+this.Text+"&nbsp;&nbsp;";
}

//设置菜单项是否被选中，不传参数则取相反值
function RightButtonMenu_Item_SetChecked(checked)
{
	this.Checked = checked==null?!this.Checked:checked;
	this.DOMElement.innerHTML = (this.Checked?"*":"&nbsp;&nbsp;")+this.Text+"&nbsp;&nbsp;";
}

//设置菜单项是否可用，不传参数则根据设置函数重新获取（若没有设置函数则取原值）
function RightButtonMenu_Item_SetEnabled(enabled)
{
	if(enabled==null)
	{
		if(this.EnabledCheckFunc!=null)
			this.Enabled = this.EnabledCheckFunc();
	}else
	{
		this.Enabled = enabled;
	}
	this.SetDefaultCSS();
}

//设置EnabledCheckFunc函数
function RightButtonMenu_Item_SetEnabledCheckFunc(func)
{
	this.EnabledCheckFunc = func;
}

//HTML的onclick事件，禁止事件冒泡
function RightButtonMenu_Item_OnClick()
{
	var obj = event.srcElement.LKSObject;
	if(obj!=null && obj.Enabled && obj.OnClick!=null)
	{
		//若当前菜单项可用并且定义了点击操作函数，则执行点击操作，并隐藏当前菜单
		for(var p=obj; p.Parent!=null; p=p.Parent);		//p为当前菜单项所在的一级菜单
		p.Hide();
		obj.OnClick();
	}
	event.cancelBubble = true;
}

//HTML的onmouseout事件，设置显示样式
function RightButtonMenu_Item_OnMouseout()
{
	this.LKSObject.SetDefaultCSS();
}

//HTML的onmouseover事件
function RightButtonMenu_Item_OnMouseover()
{
	var obj = this.LKSObject;
	if(obj.Enabled)
	{
		//仅在当前项可用时生效
		if(obj.Parent.CurItem!=obj)
		{
			//若展开的菜单项不是当前菜单项，则隐藏原展开的菜单项
			if(obj.Parent.CurItem!=null)
				obj.Parent.CurItem.Menu.Hide();
			//若当前项有子菜单，展现子菜单
			if(obj.Menu!=null)
				obj.Menu.Show();
		}
		this.className = "rightmenu_sel";
	}
}
